package org.hyl.javabase.多线程;

import java.util.ArrayList;
import java.util.List;
//这是一个错误的例子
public class errDemo {
	private static List<菜1> cas = new ArrayList<菜1>();

	public static void main(String[] argf) {

		for (int i = 0; i < 10; i++) {
			cas.add(new 菜1(i + 1));
		}
		List<助理1> zl = new ArrayList<助理1>();

		zl.add(new 助理1("洗菜工1", "洗菜"));// 9
		zl.add(new 助理1("洗菜工2", "洗菜"));
		zl.add(new 助理1("洗菜工3", "洗菜"));
		zl.add(new 助理1("切菜工4", "切菜"));
		zl.add(new 助理1("切菜工5", "切菜"));
		zl.add(new 助理1("切菜工6", "切菜"));
		zl.add(new 助理1("炒菜工7", "炒菜"));
		zl.add(new 助理1("炒菜工8", "炒菜"));
		zl.add(new 助理1("炒菜工9", "炒菜"));

		for (助理1 z : zl) {
			z.setCais(cas);
			new Thread(z).start();
		}
		// 分工 jobx = new 分工("洗菜");
		// jobx.setCais(ca);
		// 分工 jobq = new 分工("切菜");
		// jobq.setCais(ca);
		// 分工 jobc = new 分工("炒菜");
		// jobc.setCais(ca);
		// new Thread(jobx, "洗菜环节").start();
		// new Thread(jobq, "切菜环节").start();
		// new Thread(jobc, "炒菜环节").start();
	}
}

class 菜1 {
	public int state = 0; // 0 未洗过,1表示洗过了,2表示切过了,3表示炒过了
	public String name = "菜";

	public 菜1(int i) {
		this.name += i;
	}
}

class 助理1 implements Runnable { // implements 洗菜工, 切菜工, 炒菜工
	String name = "";
	boolean state = false;// false 空闲 ；true 繁忙
	List<菜1> caiList;
	int job = 0;
	String jobname = "";

	public 助理1(String name, String job) {
		this.name = name;
		this.jobname = job;
		this.job = (job.equals("洗菜")) ? 1 : (job.equals("切菜")) ? 2 : (job.equals("炒菜")) ? 3 : 0;
	}

	public void setCais(List<菜1> cais) {
		caiList = cais;
	}

	public void run() {
		// TODO Auto-generated method stub

		if (caiList == null)
			return;

		while (isNoFinish()) {

			if (this.state)
				continue;
			else
				work();

		}

	}

	public boolean isNoFinish() {
		for (菜1 c : caiList) {
			if (c.state < job)
				return true;
		}
		return false;
	}

	public void work() {
		switch (job) {
		case 1:
			洗菜();
			break;//
		case 2:
			切菜();
			break;//
		case 3:
			炒菜();
			break;//
		}
	}

	public void 洗菜() {
		//synchronized (caiList) {
			for (菜1 cai : caiList) {
				if (cai.state == 0) {
					state = true;
					System.out.println(name + "在洗菜(" + cai.name + ")");
					// Thread.sleep(30);
					cai.state = 1;
					state = false;
				}
			}
		//}
	}

	public void 切菜() {
		//synchronized (caiList) {
			for (菜1 cai : caiList) {
				if (cai.state == 1)

					state = true;
				System.out.println(name + "在切菜(" + cai.name + ")");
				// Thread.sleep(30);
				cai.state = 2;
				state = false;
			}
		//}
	}

	

	public void 炒菜() {
		//synchronized (caiList) {
			for (菜1 cai : caiList) {
				if (cai.state == 2)

					state = true;
				System.out.println(name + "在炒菜(" + cai.name + ")");
				// Thread.sleep(30);
				cai.state = 3;
				state = false;
			}
		//}
	}
}
//
// class 分工 implements Runnable {
// List<助理> zl = new ArrayList<助理>();
// List<菜> caiList = null;
// int job = 0;
// String jobname="";
// public 分工(String job) {
// jobname=job;
// this.job = (job.equals("洗菜")) ? 1 : (job.equals("切菜")) ? 2 :
// (job.equals("炒菜")) ? 3 : 0;
// }
//
// public void addZL(助理 z) {
// zl.add(z);
// }
//
// public void setCais(List cais) {
// caiList = cais;
// }
//
// public void run() {
// // TODO Auto-generated method stub
//
// if (caiList == null)
// return;
// System.out.println(jobname+"工作开始");
// while (isNoFinish()) {
// for (助理 z : zl) {
// if (z.state)
// continue;
// else
// work(z);
// }
// }
// System.out.println(jobname+"工作完成");
// }
//
// public boolean isNoFinish() {
// for (菜 c : caiList) {
// if (c.state != job)
// return true;
// }
// return false;
// }
//
// public void work(助理 z) {
// switch (job) {
// case 1:
// z.洗菜(caiList);
// break;//
// case 2:
// z.切菜(caiList);
// break;//
// case 3:
// z.炒菜(caiList);
// break;//
// }
// }
//
// }
//
// interface 洗菜工 {
// public void 洗菜(菜 cai);
// }
//
// interface 切菜工 {
// public void 洗菜(菜 cai);
// }
//
// interface 炒菜工 {
// public void 洗菜(菜 cai);
// }
